home *** CD-ROM | disk | FTP | other *** search
- /********************************************************************/
- /* SOURCE CODE FILE */
- /********************************************************************/
- /*
- * >>> File name: CLSS DrawObject.c
- *
- * >>> Purpose: Methods for Draw Objects
- * >>> Project: PoopDraw Version 1
- * >>> Date: 2/20/89
- * >>> By: Adam Treister
- *
- */
- /********************************************************************/
- /* For Your Information 1802 Hillside Rd. SB CA 93101 */
- /********************************************************************/
-
- #include "PoopDrawInc"
-
- /***** Private Functions *********************************************/
-
-
- private void Init(DrawObjectHandle ObjectH,LPtr InParmP);
- private void Dispose(DrawObjectHandle ObjectH);
- private void Draw(DrawObjectHandle ObjectH);
- private void MouseDown(DrawObjectHandle ObjectH);
- private void KeyDown(DrawObjectHandle ObjectH,LPtr InParmP);
-
- int PtInDrawObjectHandle(Point pt,DrawObjectHandle ObjectH);
- private void ToggleSelect(DrawObjectHandle ObjectH);
- private void DragActiveObjects(ObjectHandle TheWindowData);
- private void TrackPtInHandle(Point pt,DrawObjectHandle ObjectH);
- private void AdjustObjBounds(Rect *rP,int handleNumber);
-
- private void DrawHandles(DrawObjectHandle ObjectH);
- private void Inval(DrawObjectHandle ObjectH);
- private void SelectRect(DrawObjectHandle ObjectH,LPtr InParmP);
-
- private void SetFill(DrawObjectHandle ObjectH,LPtr InParmP);
- private void SetPenPat(DrawObjectHandle ObjectH,LPtr InParmP);
- private void SetPenSize(DrawObjectHandle ObjectH,LPtr InParmP);
-
- Pack(DrawObjectHandle ObjectH,Handle h);
- void UnPack(DrawObjectHandle ObjectH,Ptr *pP);
- SetLength(DrawObjectHandle ObjectH);
- #define SKIP2FLDS 8L
-
-
- /***** Dispatch *****************************************************/
-
- void DrawObjectDispatch(ObjectH,Message,ParmP)
- ObjectHandle ObjectH;
- int Message;
- LPtr ParmP;
-
- {
- switch(Message)
- {
-
- case INIT: Init(ObjectH,ParmP); break;
- case DISPOSE: Dispose(ObjectH); break;
- case DRAWHANDLES: DrawHandles(ObjectH); break;
- case MOUSEDOWN: MouseDown(ObjectH); break;
- case TRACK: TrackPtInHandle(*(Point *)ParmP, ObjectH); break;
- case INVAL:
- case ERASE: Inval(ObjectH); break;
-
- case SELECT: BitSet(&(*ObjectH)->attributes,SelectedBit);
- Inval(ObjectH); break;
- case UNSELECT: BitClr(&(*ObjectH)->attributes,SelectedBit);
- Inval(ObjectH); break;
- case SELECTRECT: SelectRect(ObjectH,ParmP); break;
-
- case FILL: SetFill(ObjectH,ParmP); break;
- case PENPAT: SetPenPat(ObjectH,ParmP); break;
- case PENSIZE: SetPenSize(ObjectH,ParmP); break;
-
- case SETLEN: SetLength(ObjectH); break;
- case PACK: Pack(ObjectH,ParmP); break;
- case UNPACK: UnPack(ObjectH,ParmP); break;
-
- default: ObjectDispatch(ObjectH,Message,ParmP); break;
- }
- }
-
-
- /********************************************************************/
- DrawObjectHandle MakeDrawObject(void);
-
- DrawObjectHandle MakeDrawObject()
- {
- DrawObjectHandle ObjectH;
-
- ObjectH = _GetHandleToRecord(DrawObjectRec);
- (*ObjectH)->dispatch = DrawObjectDispatch;
- return(ObjectH);
- }
-
- /*---------------------------------------------------------------*/
- void Init(ObjectH,ParmP)
- register DrawObjectHandle ObjectH;
- LPtr ParmP;
-
- {
-
- (*ObjectH)->bounds = *((Rect *) ParmP);
- BitSet(&(*ObjectH)->attributes,VisibleBit);
- GetPort(&(*ObjectH)->port);
- WDispatch((*ObjectH)->port,GETDRAWSTATE,&(*ObjectH)->drawState);
- }
-
- /*-----------------------------------generic method--------------*/
- /*
- * Function: -- Dispose
- *
- * Date: -- Feb. 20, 1989
- * PoopDraw Version 1 -- Copyright FYI,1989 -- Adam Treister
- /*---------------------------------------------------------------*/
-
- void Dispose(ObjectH)
- register DrawObjectHandle ObjectH;
-
- {
- Inval(SELF);
- WDispatch((*ObjectH)->port,DELOBJECT,SELF);
- DisposeHandle(ObjectH);
-
- }
- /*-----------------------------------generic method--------------*/
- /*
- * Function: -- MouseDown
- *
- * Date: -- Feb. 20, 1989
- * PoopDraw Version 1 -- Copyright FYI,1989 -- Adam Treister
- /*---------------------------------------------------------------*/
- void MouseDown(ObjectH)
- register DrawObjectHandle ObjectH;
-
- {
- register ObjectHandle WindowData;
- extern EventRecord Event;
- int spot;
- Point pt;
- WindowPtr wP;
-
- WindowData = (ObjectHandle) GetWRefCon(wP = (*ObjectH)->port);
- pt = Event.where;
- GlobalToLocal(&pt);
- spot = PtInDrawObjectHandle(pt,ObjectH);
-
- if (spot)
- if (spot == 5)
- {
- if (_ShiftKeyDown(Event)) ToggleSelect(ObjectH);
- else if (BitTst(&(*ObjectH)->attributes,SelectedBit))
- {
- WDispatch(wP,MOVE,NULL);
- }
- else
- {
- WDispatch(wP,CLRSELECT,NULL);
- WDispatch(wP,SELECT,ObjectH);
- Dispatch(ObjectH,SELECT,NULL);
- }
- }
- else Dispatch(ObjectH,TRACK,&pt);
-
- }
- /*---------------------------------------------------------------*/
- void KeyDown(ObjectH,InParms)
- register DrawObjectHandle ObjectH;
- LPtr InParms;
-
- {
- if ((*InParms & charCodeMask) == BACKSPACE)
- Dispatch(SELF,ERASE,NULL);
-
- }
- /*---------------------------------------------------------------*/
- void ToggleSelect(ObjectH)
- register DrawObjectHandle ObjectH;
- {
- int message;
- Boolean isSelected;
-
- isSelected = BitTst(&(*ObjectH)->attributes,SelectedBit);
- message = (isSelected) ? UNSELECT : SELECT;
- WDispatch((*ObjectH)->port,message,ObjectH);
- Dispatch(ObjectH,message,NULL);
- }
- /*---------------------------------------------------------------*/
- void Inval(ObjectH)
- register DrawObjectHandle ObjectH;
-
- {
- Rect r;
-
- r = (*ObjectH)->bounds;
- InsetRect(&r,-HANDLEWIDTH,-HANDLEWIDTH);
- EraseRect(&r);
- InvalRect(&r);
- }
- /*---------------------------------------------------------------*/
- void SetFill(ObjectH,ParmP)
- register DrawObjectHandle ObjectH;
- LPtr ParmP;
- {
- Dispatch(ObjectH,INVAL,NULL);
- (*ObjectH)->drawState.fillPat = * (IPtr)ParmP;
- }
- /*---------------------------------------------------------------*/
- void SetPenPat(ObjectH,ParmP)
- register DrawObjectHandle ObjectH;
- LPtr ParmP;
- {
- Dispatch(ObjectH,INVAL,NULL);
- (*ObjectH)->drawState.penPat = * (IPtr)ParmP;
- }
- /*---------------------------------------------------------------*/
- void SetPenSize(ObjectH,ParmP)
- register DrawObjectHandle ObjectH;
- LPtr ParmP;
- {
- Dispatch(ObjectH,INVAL,NULL);
- (*ObjectH)->drawState.penSize = * (IPtr)ParmP;
-
- }
- /*---------------------------------------------------------------*/
-
- void DrawHandles(ObjectH)
- register DrawObjectHandle ObjectH;
-
- {
- Rect r,objRect;
- int HalfObjWidth,HalfObjHeight;
- PenState penSave;
-
- GetPenState(&penSave);
- PenPat(black); PenMode(patXor);
-
- objRect = (*ObjectH)->bounds;
- SetRect(&r,objRect.left-HANDLEWIDTH+2,objRect.top-HANDLEWIDTH+2,
- objRect.left+HANDLEWIDTH-2,objRect.top+HANDLEWIDTH-2);
-
- HalfObjWidth = Width(objRect) / 2;
- HalfObjHeight = Height(objRect) / 2;
-
- PaintRect(&r); OffsetRect(&r,HalfObjWidth,0);
- PaintRect(&r); OffsetRect(&r,HalfObjWidth,0);
- PaintRect(&r); OffsetRect(&r,0,HalfObjHeight);
- PaintRect(&r); OffsetRect(&r,0,HalfObjHeight);
- PaintRect(&r); OffsetRect(&r,-HalfObjWidth,0);
- PaintRect(&r); OffsetRect(&r,-HalfObjWidth,0);
- PaintRect(&r); OffsetRect(&r,0,-HalfObjHeight);
- PaintRect(&r);
- PenMode(patCopy);
- SetPenState(&penSave);
- }
- /*---------------------------------------------------------------*/
- /*
- * Function: -- PtInDrawObjectHandle
- *
- * This function returns the numbers 1 thru 9 to specify
- * which handle the point was in. 0 means the point is in neither
- * the object nor a handle. 5 means pt is in the center.
- *
- * Date: -- Feb. 20, 1989
- * PoopDraw Version 1 -- Copyright FYI,1989 -- Adam Treister
- /*---------------------------------------------------------------*/
-
- int PtInDrawObjectHandle(pt,ObjectH)
- Point pt;
- register DrawObjectHandle ObjectH;
- {
- Rect Rim;
- register int vCoord,hCoord;
- register int vCenter,hCenter;
- Boolean inRect;
-
- Rim = (*ObjectH)->bounds;
- InsetRect(&Rim,-(HANDLEWIDTH-2),-(HANDLEWIDTH-2));
- inRect = PtInRect(pt,&Rim);
- if ((*ObjectH)->class == GROUP) return(inRect ? 5 : 0);
- vCenter = (Rim.top + Rim.bottom) / 2;
- hCenter = (Rim.left + Rim.right) / 2;
-
- if (ABS(pt.v - Rim.top) <= HANDLEWIDTH) vCoord = 0;
- else if (ABS(pt.v - vCenter) <= HANDLEWIDTH) vCoord = 1;
- else if (ABS(pt.v - Rim.bottom) <= HANDLEWIDTH) vCoord = 2;
- else return(inRect ? 5 : 0);
-
- if (ABS(pt.h - Rim.left) <= HANDLEWIDTH) hCoord = 0;
- else if (ABS(pt.h - hCenter) <= HANDLEWIDTH) hCoord = 1;
- else if (ABS(pt.h - Rim.right) <= HANDLEWIDTH) hCoord = 2;
- else return(inRect ? 5 : 0);
-
- return( 3 * vCoord + hCoord + 1);
- }
-
-
- /*---------------------------------------------------------------*/
- /*
- * Function: -- TrackPtInHandle
- *
- *
- * Date: -- Feb. 20, 1989
- * PoopDraw Version 1 -- Copyright FYI,1989 -- Adam Treister
- /*---------------------------------------------------------------*/
-
-
- void TrackPtInHandle(pt, ObjectH)
- Point pt;
- DrawObjectHandle ObjectH;
-
- {
-
- Rect newRect,InnerRim,OuterRim;
- int handleNumber;
- Point endPos;
-
- InnerRim = OuterRim = newRect = (*ObjectH)->bounds;
- InsetRect(&InnerRim,3,3);
- InsetRect(&OuterRim,-(HANDLEWIDTH-2),-(HANDLEWIDTH-2));
-
- PenPat(gray); PenMode(patXor); PenSize(1,1);
- if (PtInRect(pt,&OuterRim))
- if (!PtInRect(pt,&InnerRim))
- {
- if (handleNumber = PtInDrawObjectHandle(pt,ObjectH))
- {
- while (StillDown())
- {
- Point curPos;
- Rect *rP;
-
- rP = &newRect;
- FrameRect(rP);
- GetMouse(&curPos);
- switch (handleNumber)
- {
- case 1: topLeft(*rP) = curPos; break;
- case 2: rP->top = curPos.v; break;
- case 3: rP->top = curPos.v;
- rP->right = curPos.h; break;
- case 4: rP->left = curPos.h; break;
- case 6: rP->right = curPos.h; break;
- case 7: rP->bottom = curPos.v;
- rP->left = curPos.h; break;
- case 8: rP->bottom = curPos.v; break;
- case 9: botRight(*rP) = curPos; break;
-
- }
- FrameRect(rP);
- }
-
- EraseRect(&OuterRim);
- InvalRect(&OuterRim);
- GetMouse(&endPos);
- if (PtInRect(endPos,&((*ObjectH)->port)->portRect))
- Dispatch(ObjectH,RESIZE,&newRect);
- }
- }
- PenNormal();
- }
- /*------------------------------------------------------------------*/
-
- void SelectRect(ObjectH,ParmP)
- DrawObjectHandle ObjectH;
- LPtr ParmP;
- {
- Rect intersection,*rP;
-
- rP = (Rect *) ParmP;
- SectRect(rP,&(*ObjectH)->bounds,&intersection);
- if (EqualRect(&(*ObjectH)->bounds,&intersection))
- {
- WDispatch((*ObjectH)->port,SELECT,ObjectH);
- Dispatch(ObjectH,SELECT,NULL);
- }
- }
- /*------------------------------------------------------------------*/
- SetLength(ObjectH)
- DrawObjectHandle ObjectH;
- {
- (*ObjectH)->length = GetHandleSize(ObjectH) - SKIP2FLDS;
- }
- /*------------------------------------------------------------------*/
-
- Pack(ObjectH,h)
- DrawObjectHandle ObjectH;
- Handle h;
- {
- Size size;
- IPtr p;
-
- size = GetHandleSize(h);
- SetHandleSize(h,size + (*ObjectH)->length); MEM_CHECK
- HLock(h);
-
- p = *h + size; /* move to end of existing handle */
- BlockMove(&(*ObjectH)->class,p,(long)(*ObjectH)->length);
-
- HUnlock(h);
- }
- /*------------------------------------------------------------------*/
- void UnPack(ObjectH,pP)
- DrawObjectHandle ObjectH;
- Ptr *pP;
- {
- Size obSize;
- IPtr p = *pP;
-
- (*ObjectH)->class = *p++;
- (*ObjectH)->length = *p++;
- BlockMove(*pP,&(*ObjectH)->class,(long)(*ObjectH)->length);
- *pP += (*ObjectH)->length;
-
- }
-